package com.wx.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.wx.po.TextMessage;

public class MessageUtil {
	public static final String MESSAGE_TEXT = "text";
	public static final String MESSAGE_IMAGE = "image";
	public static final String MESSAGE_VOICE = "voice";
	public static final String MESSAGE_LINK = "link";
	public static final String MESSAGE_LOCATION = "location";
	public static final String MESSAGE_EVENT = "event";
	public static final String MESSAGE_SUBSCRIBE = "subscribe";
	public static final String MESSAGE_UNSUBSCRIBE = "unsubscribe";
	public static final String MESSAGE_CLICK = "CLICK";
	public static final String MESSAGE_VIEW = "VIEW";
	public static final String MESSAGE_NEWS = "news";
	
	/**
	 * XML装换为Map集合
	 * @param request
	 * @return
	 * @throws DocumentException
	 * @throws IOException
	 */
	public static Map<String, Object> xmlToMap(HttpServletRequest request) throws DocumentException, IOException {
		Map<String, Object> map = new HashMap<String, Object>();
		SAXReader reader = new SAXReader();

		// 从request中获取输入流
		InputStream ins = request.getInputStream();
		Document doc = reader.read(ins);
		
		Element root = doc.getRootElement();
		
		List<Element> list = root.elements();

		for (Element element : list) {
			map.put(element.getName(), element.getText());
		}
		ins.close();
		
		return map;
	}
	
	/**
	 * 包装为XML————普通消息
	 * @param textMessage
	 * @return
	 */
	public static String textMessageToXml(TextMessage textMessage) {
//		XStream xstream = new XStream();
//		xstream.alias("xml", textMessage.getClass());
//		return xstream.toXML(textMessage);
		
		/*
		 * <xml>  
		 * <ToUserName>< ![CDATA[toUser] ]></ToUserName>  
		 * <FromUserName>< ![CDATA[fromUser] ]></FromUserName>  
		 * <CreateTime>1348831860</CreateTime>  
		 * <MsgType>< ![CDATA[text] ]></MsgType>  
		 * <Content>< ![CDATA[this is a test] ]></Content>  
		 * <MsgId>1234567890123456</MsgId>  
		 * </xml>
		 */
		StringBuffer str = new StringBuffer();
		str.append("<xml>");
		str.append("<ToUserName>" + textMessage.getToUserName() + "</ToUserName>");
		str.append("<FromUserName>" + textMessage.getFromUserName() + "</FromUserName>");
		str.append("<CreateTime>" + textMessage.getCreateTime() + "</CreateTime>");
		str.append("<MsgType>" + textMessage.getMsgType() + "</MsgType>");
		str.append("<Content>" + textMessage.getContent() + "</Content>");
		str.append("</xml>");
		return str.toString();
	}
	
	/**
	 * 包装为XML————图文消息
	 * @param textMessage
	 * @return
	 */
	public static String graphicToXml(TextMessage textMessage) {
		/*
		 * <xml>
		 * <ToUserName>< ![CDATA[toUser] ]></ToUserName>
		 * <FromUserName>< ![CDATA[fromUser] ]></FromUserName>
		 * <CreateTime>12345678</CreateTime>
		 * <MsgType>< ![CDATA[news] ]></MsgType>
		 * <ArticleCount>1</ArticleCount>
		 * <Articles>
		 * <item>
		 * <Title>< ![CDATA[title1] ]></Title> 
		 * <Description>< ![CDATA[description1] ]></Description>
		 * <PicUrl>< ![CDATA[picurl] ]></PicUrl>
		 * <Url>< ![CDATA[url] ]></Url>
		 * </item>
		 * </Articles>
		 * </xml>
		 */
		StringBuffer sb = new StringBuffer();
		sb.append("<xml>");
		sb.append("<ToUserName>" + textMessage.getToUserName() + "</ToUserName>");
		sb.append("<FromUserName>" + textMessage.getFromUserName() + "</FromUserName>");
		sb.append("<CreateTime>" + textMessage.getCreateTime() + "</CreateTime>");
		sb.append("<MsgType>" + textMessage.getMsgType() + "</MsgType>");
		sb.append("<ArticleCount>" + "1" + "</ArticleCount>");
		sb.append("<Articles><item>");
		sb.append("<Title>" + textMessage.getTitle() + "</Title>");
		sb.append("<Description>" + textMessage.getDescription() + "</Description>");
		sb.append("<PicUrl>" + textMessage.getImageUrl() + "</PicUrl>");
		sb.append("<Url>" + textMessage.getUrl() + "</Url>");
		sb.append("</item></Articles>");
		sb.append("</xml>");
		return sb.toString();
	}
	
	/**
	 * 包装为XML————事件消息
	 * @param textMessage
	 * @return
	 */
	public static String eventMessageToXml(TextMessage textMessage) {
		/*<xml>
		 * <ToUserName>< ![CDATA[toUser] ]></ToUserName>
		 * <FromUserName>< ![CDATA[FromUser] ]></FromUserName>
		 * <CreateTime>123456789</CreateTime>
		 * <MsgType>< ![CDATA[event] ]></MsgType>
		 * <Event>< ![CDATA[subscribe] ]></Event>
		 * </xml>
		 */
		StringBuffer str = new StringBuffer();
		str.append("<xml>");
		str.append("<ToUserName>" + textMessage.getToUserName() + "</ToUserName>");
		str.append("<FromUserName>" + textMessage.getFromUserName() + "</FromUserName>");
		str.append("<CreateTime>" + textMessage.getCreateTime() + "</CreateTime>");
		str.append("<MsgType>" + textMessage.getMsgType() + "</MsgType>");
		str.append("<Event>" + textMessage.getContent() + "</Event>");
		str.append("</xml>");
		return str.toString();
	}
	
	/**
	 * 组装XML
	 * @param toUserName
	 * @param fromUserName
	 * @param content
	 * @return
	 */
	public static String initText(String toUserName, String fromUserName, String content) {
		TextMessage text = new TextMessage();
		text.setFromUserName(toUserName);
		text.setToUserName(fromUserName);
		text.setMsgType(MessageUtil.MESSAGE_TEXT);
		text.setCreateTime(new Date().getTime());
		text.setContent(content);
//		if (text.getMsgType().equals(MESSAGE_TEXT)) {
//			return textMessageToXml(text);
//		} else if (text.getMsgType().equals(MESSAGE_EVENT)) {
//			return eventMessageToXml(text);
//		} else {
//			return null;
//		}
		return textMessageToXml(text);
	}
	
	/**
	 * 主菜单——主目录
	 * @return
	 */
	public static String menuText() {
		StringBuffer sb = new StringBuffer();
		sb.append("基于OpenCV的车牌识别系统\r\n\n" + 
				"1.项目介绍\r\n" + 
				"2.人员组成\r\n" + 
				"3.用户注册\r\n" + 
				"4.系统管理\r\n" + 
				"5.普通管理\r\n" + 
				"6.个人用户\r\n" + 
				"0.返回菜单 ");
		return sb.toString();
	}
	
	/**
	 * 菜单1
	 * @return
	 */
	public static String firstMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("车牌识别系统(Vehicle License Plate Recognition，VLPR) 是计算机视频图像识别技术在车辆牌照识别中的一种应用。"
				+ "车牌识别在高速公路车辆管理中得到广泛应用车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来，通过车牌提取、图像预处理、特征提取、车牌字符识别等技术，识别车辆牌号、颜色等信息，"
				+ "目前最新的技术水平为字母和数字的识别率可达到99.7%，汉字的识别率可达到99%。\r\n" 
				+ "在停车场管理中，车牌识别技术也是识别车辆身份的主要手段。在深圳市公安局建设的《停车库（场）车辆图像和号牌信息采集与传输系统技术要求》中，车牌识别技术成为车辆身份识别的主要手段。\r\n" 
				+ "车牌识别技术结合电子不停车收费系统（ETC）识别车辆，过往车辆通过道口时无须停车，即能够实现车辆身份自动识别、自动收费。"
				+ "在车场管理中，为提高出入口车辆通行效率，车牌识别针对无需收停车费的车辆，建设无人值守的快速通道，免取卡、不停车的出入体验，正改变出入停车场的管理模式。");
		return sb.toString();
	}
	
	/**
	 * 菜单2
	 * @return
	 */
	public static String secondMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("成员组成：伍锦铭、苑皓、冼迪森、翁宇健、黎斯洋\r\n" + 
				"指导老师：罗回彬");
		return sb.toString();
	}
	
	/**
	 * 系统管理主界面
	 * @return
	 */
	public static String adminMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("系统管理：\r\n\n"
				+ "40.查看已有用户\r\n"
				+ "41.系统管理员管理\r\n"
				+ "42.工作人员管理\r\n"
				+ "43.用户管理\r\n"
				+ "44.信息查询\r\n"
				+ "45.黑名单管理");
		return sb.toString();
	}
	
	/**
	 * 工作人员管理
	 * @return
	 */
	public static String workMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("工作人员管理：\r\n\n"
				+ "42.工作人员管理\r\n"
				+ "44.信息查询\r\n"
				+ "45.黑名单管理");
		return sb.toString();
	}
	
	/**
	 * 用户管理主界面
	 * @return
	 */
	public static String userMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("个人用户：\r\n\n"
				+ "61.个人信息管理\r\n"
				+ "62.车牌管理\r\n"
				+ "63.信息查询");
		return sb.toString();
	}
	
	/**
	 * 系统管理员管理
	 * @return
	 */
	public static String manageAdminMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("系统管理员管理：\r\n\n"
				+ "410.查看已有系统管理员\r\n"
				+ "411.绑定新增系统管理员\r\n"
				+ "412.删除已有系统管理员");
		return sb.toString();
	}
	
	/**
	 * 工作人员管理
	 * @return
	 */
	public static String manageWorkerMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("工作人员管理：\r\n\n"
				+ "420.查看已有工作人员\r\n"
				+ "421.绑定新增工作人员\r\n"
				+ "422.删除已有工作人员");
		return sb.toString();
	}
	
	/**
	 * 用户管理
	 * @return
	 */
	public static String manageUserMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("用户管理：\r\n\n"
				+ "430.查看用户信息\r\n"
				+ "431.修改用户信息\r\n"
				+ "432.删除已有用户");
		return sb.toString();
	}
	
	/**
	 * 信息查询
	 * @return
	 */
	public static String queryInfoMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("信息查询：\r\n\n"
				+ "441.根据电话查询用户信息\r\n"
				+ "442.根据用户名查询用户信息\r\n"
				+ "443.根据车牌查询用户信息\r\n"
				+ "444.根据车牌查询进出记录\r\n"
				+ "445.根据用户查询用户进出记录");
		return sb.toString();
	}
	
	/**
	 * 黑名单管理
	 */
	public static String manageBlockUserMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("黑名单管理：\r\n\n"
				+ "450.查看已有黑名单信息\r\n"
				+ "451.新增黑名单\r\n"
				+ "452.删除黑名单");
		return sb.toString();
	}
	
	/**
	 * 用户个人信息管理
	 * @return
	 */
	public static String personalInfoManage() {
		StringBuffer sb = new StringBuffer();
		sb.append("个人信息管理：\r\n\n"
				+ "610.查看个人信息\r\n"
				+ "611.修改个人信息");
		return sb.toString();
	}
	
	/**
	 * 车牌管理
	 * @return
	 */
	public static String manageCarMenu() {
		StringBuffer sb = new StringBuffer();
		sb.append("车牌信息管理：\r\n\n"
				+ "620.查看已绑定车牌\r\n"
				+ "621.绑定新增车牌\r\n"
				+ "622.删除绑定车牌");
		return sb.toString();
	}
	
	/**
	 * 车牌出入信息查询
	 * @return
	 */
	public static String infoQuery() {
		StringBuffer sb = new StringBuffer();
		sb.append("用户信息查询：\r\n\n"
				+ "630:查询所有出入记录\r\n"
				+ "631:根据已绑定车牌ID查询出入记录");
		return sb.toString();
	}

}
